// -*- c++ -*-
#ifndef SORT4_H
#define SORT4_H

#include "common.h"

module Sort4 {
 input:
  u16_t a, b, c, d;
 output:
  u16_t p, q, r, s;
};

#endif

////////////////////////////////////////////////////////////////

#include "sort4.h"
#include "cmp.h"

//
// 4-entry sorting network
//
//   a --+-----+-----> p
//       |     |
//   b --|--+--+--+--> q
//       |  |     |
//   c --+--|--+--+--> r
//          |  |
//   d -----+--+-----> s
//
// or more precisely,
//
//             .---.        .---.
//   a ------->| C |------->| C |------------> p
//             | M |        | M |    .---.
//   b --. .-->| P |--. .-->| P |--->| C |---> q
//        X    :---:   X    :---:    | M |
//   c --' `-->| C |--' `-->| C |--->| P |---> r
//             | M |        | M |    `---'
//   d ------->| P |------->| P |------------> s
//             `---'        `---'
//

struct Sort4 {
  Cmp  c02, c13, c01, c23, c12;
};

Sort4() {
  c02(a, c);
  c13(b, d);
  c01(c02.x, c13.x);
  c23(c02.y, c13.y);
  c12(c01.y, c23.x);
  p = c01.x;
  q = c12.x;
  r = c12.y;
  s = c23.y;
}

